#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include "constantes.h"
#include "graphique.h"
#include "advancewars.h"

//Tableau indiquant la défense + les coûts de chaque terrain dans l'ordre foor,tires,tread,plane,boat
static int lands_stats[6][6]={
    //Plaine
    {1,1,2,1,1,COUT_MAX},
    //Montagne
    {4,2,COUT_MAX,COUT_MAX,1,COUT_MAX},
    //Forêt
    {2,1,3,2,1,COUT_MAX},
    //Route
    {0,1,1,1,1,COUT_MAX},
    //Base
    {3,1,1,1,1,COUT_MAX},
    //Mer
    {0,COUT_MAX,COUT_MAX,COUT_MAX,1,1}
    };


void cursor(map carte, SDL_Surface* ecran, player *joueur, player *adversaire) {
	SDL_Surface *curseur = NULL, *texte = NULL;
        TTF_Font *police = NULL;
        police = TTF_OpenFont("Walkway Black.ttf", 40);
        SDL_Color couleurNoire = {0, 0, 0};
	SDL_Rect position_curseur, position_texte;
        position_texte.x = 34*15;
        position_texte.y = 10;
	position_curseur.x = 9*TAILLE_BLOC;
	position_curseur.y = 9*TAILLE_BLOC;
	curseur= IMG_Load("images/curseur.gif");
	SDL_BlitSurface(curseur, NULL, ecran, &position_curseur);
	SDL_Flip(ecran);
	SDL_Event event;
	
	SDL_EnableKeyRepeat(100, 100);

	int x, y;
	int continuer = 1;
        int enable_deplace = 0;
        int x_deplace = 0, y_deplace = 0;
	
	while (continuer)
	{
            x = position_curseur.x/TAILLE_BLOC;
            y = position_curseur.y/TAILLE_BLOC;
		SDL_WaitEvent(&event);
		switch(event.type)
		{
			case SDL_KEYDOWN:
				switch(event.key.keysym.sym)
				{
                                    
			case SDLK_LEFT:
				if(x>0)
					position_curseur.x -= TAILLE_BLOC;
				break;
				
			case SDLK_RIGHT:
				if(x<14)
					position_curseur.x += TAILLE_BLOC;
				break;
				
			case SDLK_UP:
				if(y>0)
					position_curseur.y -= TAILLE_BLOC;
				break;
				
			case SDLK_DOWN:
				if(y<14)
					position_curseur.y += TAILLE_BLOC;
				break;
			
			case SDLK_RETURN:
                            if(carte[y][x].occupied == 1 && enable_deplace==0) {
				    int deplace = from_land(y,x, carte, *joueur, *adversaire).deplacement_max;
				    deplacement(carte, from_land(y, x, carte, *joueur, *adversaire), deplace, y, x, *joueur, *adversaire);
                                    enable_deplace = 1;
                                    x_deplace = x;
                                    y_deplace = y;
                                    texte = TTF_RenderText_Blended(police, from_land(y, x, carte, *joueur, *adversaire).nom, couleurNoire);
                                    SDL_BlitSurface(texte, NULL, ecran, &position_texte);
                            }
                            else if(enable_deplace == 1 && x == x_deplace && y == y_deplace) {
				SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
				cleanDeplacement(carte);
				enable_deplace = 0;
                            }
				break;
			    
			    default:
				    break;
				}
				break;
			
			case SDL_QUIT:
				exit(EXIT_SUCCESS);
				break;
			
			default:
				break;
		}
		// Effacement de l'écran
		
		affiche(carte,ecran, *joueur, *adversaire);
		SDL_BlitSurface(curseur, NULL, ecran, &position_curseur);
		SDL_Flip(ecran);
		
	}
        TTF_CloseFont(police);
        SDL_FreeSurface(texte);
	SDL_FreeSurface(curseur);
}


void deplacement(map carte, unit unite, int move, int x, int y, player joueur, player adversaire){
    if (move>=0){
        carte[x][y].available = 1;
        land voisin;
        int malus;                  //différent de zéro si l'adversaire y a une unité
        // Déplacement suivant x
        if (x+1 < TAILLE_ZONE) {
            voisin = carte[x+1][y];
            if (from_land(x+1, y, carte, joueur, adversaire).couleur==3-unite.couleur){
                malus = COUT_MAX;
            } else {
                malus = 0;
            }
            deplacement(carte, unite, move - voisin.costs[unite.support-1] - malus, x+1, y, joueur, adversaire);
        }
        if (x-1 >= 0) {
            voisin = carte[x-1][y];
            if (from_land(x-1, y, carte, joueur, adversaire).couleur==3-unite.couleur){
                malus = COUT_MAX;
            } else {
                malus = 0;
            }
            deplacement(carte, unite, move - voisin.costs[unite.support-1] - malus, x-1, y, joueur, adversaire);
        }
        // Déplacement suivant y
        if (y+1 < TAILLE_ZONE) {
            voisin = carte[x][y+1];
            if (from_land(x, y+1, carte, joueur, adversaire).couleur==3-unite.couleur){
                malus = COUT_MAX;
            } else {
                malus = 0;
            }
            deplacement(carte, unite, move - voisin.costs[unite.support-1] - malus, x, y+1, joueur, adversaire);
        }
        if (y-1 >= 0) {
            voisin = carte[x][y-1];
            if (from_land(x, y-1, carte, joueur, adversaire).couleur==3-unite.couleur){
                malus = COUT_MAX;
            } else {
                malus = 0;
            }
            deplacement(carte, unite, move - voisin.costs[unite.support-1] - malus, x, y-1, joueur, adversaire);
        }
    }
}


void cleanDeplacement(map carte) {
    int i,j;
    for(i=0;i<TAILLE_ZONE;i++) {
            for(j=0;j<TAILLE_ZONE;j++) {
                carte[i][j].available = 0;
            }
    }
}

void affiche(map carte, SDL_Surface* ecran, player joueur, player adversaire) {
	SDL_Surface *plaine = NULL, *montagne = NULL, *route= NULL, *foret= NULL, *mer= NULL, *base1 = NULL, *base2 = NULL;
        SDL_Surface *plaine_available = NULL, *montagne_available = NULL, *route_available = NULL, *foret_available= NULL, *mer_available= NULL;
	SDL_Surface *soldat_rouge = NULL, *soldat_bleu = NULL, *tank_rouge = NULL, *tank_bleu = NULL;
        SDL_Rect position;
	
	plaine = IMG_Load("images/plaine.jpg");
        plaine_available = IMG_Load("images/plaine_available.jpg");
	montagne = IMG_Load("images/montagne.jpg");
        montagne_available = IMG_Load("images/montagne_available.jpg");
	foret = IMG_Load("images/foret.png");
        foret_available = IMG_Load("images/foret_available.png");
	mer = IMG_Load("images/mer.png");
        mer_available = IMG_Load("images/mer_available.png");
	base1 = IMG_Load("images/base_rouge.jpg");
	base2 = IMG_Load("images/base_bleue.jpg");
	route = IMG_Load("images/route.jpg");
        route_available = IMG_Load("images/route_available.jpg");
        soldat_rouge = IMG_Load("images/soldat_rouge.gif");
        soldat_bleu = IMG_Load("images/soldat_bleu.gif");
        tank_rouge = IMG_Load("images/tank_rouge.gif");
	tank_bleu = IMG_Load("images/tank_bleu.gif");


	int i,j;
	
	
	for (i = 0 ; i < 15 ; i++)
        {
            for (j = 0 ; j < 15 ; j++)
            {
		position.x = j* TAILLE_BLOC;
                position.y = i * TAILLE_BLOC;

                switch(carte[i][j].name)
                {
                    case 0:
                        if(carte[i][j].available == 0)
                            SDL_BlitSurface(plaine, NULL, ecran, &position);
                        else
                            SDL_BlitSurface(plaine_available, NULL, ecran, &position);
                        break;
                    case 1:
                        if(carte[i][j].available == 0)
                            SDL_BlitSurface(montagne, NULL, ecran, &position);
                        else
                            SDL_BlitSurface(montagne_available, NULL, ecran, &position);
                        break;
                    case 2:
                        if(carte[i][j].available == 0)
                            SDL_BlitSurface(route, NULL, ecran, &position);
                        else
                             SDL_BlitSurface(route_available, NULL, ecran, &position);
                        break;
		case 3:
                        if(carte[i][j].available == 0)
                            SDL_BlitSurface(foret, NULL, ecran, &position);
                        else
                             SDL_BlitSurface(foret_available, NULL, ecran, &position);
                        break;
		
		case 4:
                        if(carte[i][j].available == 0)
                            SDL_BlitSurface(mer, NULL, ecran, &position);
                        else
                             SDL_BlitSurface(mer_available, NULL, ecran, &position);
                        break;
                    case 5:
                        SDL_BlitSurface(base1, NULL, ecran, &position);
                        break;
		    case 6:
                        SDL_BlitSurface(base2, NULL, ecran, &position);
                        break;
                }
                if(carte[i][j].occupied == 1) {
                    switch(from_land(i, j, carte, joueur, adversaire).name) {
                        case soldat:
                            if(from_land(i, j, carte, joueur, adversaire).couleur == red)
                                SDL_BlitSurface(soldat_rouge, NULL, ecran, &position);
                            else
                                SDL_BlitSurface(soldat_bleu, NULL, ecran, &position);
                            break;
                        case tank:
				if(from_land(i, j, carte, joueur, adversaire).couleur == red)
					SDL_BlitSurface(tank_rouge, NULL, ecran, &position);
				else
					SDL_BlitSurface(tank_bleu, NULL, ecran, &position);
                            break;
			
			default:
				break;
                    }
                }
            }
        }
	
	SDL_FreeSurface(plaine);
        SDL_FreeSurface(plaine_available);
	SDL_FreeSurface(montagne);
        SDL_FreeSurface(montagne_available);
	SDL_FreeSurface(foret);
        SDL_FreeSurface(foret_available);
	SDL_FreeSurface(mer);
        SDL_FreeSurface(mer_available);
	SDL_FreeSurface(route);
        SDL_FreeSurface(route_available);
	SDL_FreeSurface(base1);
	SDL_FreeSurface(base2);
        SDL_FreeSurface(soldat_rouge);
        SDL_FreeSurface(soldat_bleu);
        SDL_FreeSurface(tank_rouge);
	SDL_FreeSurface(tank_bleu);
}

void zone(map carte) {
 int i,j;
    char c;
    FILE *f1 = NULL;
    f1 = fopen("test.map","r");
    if (f1 != NULL)
    {
        for(i=0;i<15;i++) {
            for(j=0;j<15;j++) {
                carte[i][j].occupied = 0; // Case innocupée par défaut
                carte[i][j].proprio = 0; // Pas de propriétaire
                carte[i][j].available = 0;
                fscanf(f1, "%c", &c);
                if(feof(f1)) {
                    printf("Fichier map corrompu !");   // Si on arrive à la fin du fichier trop tôt
                    exit(EXIT_FAILURE);
                }
                switch(c) {
                    case '.':
                        carte[i][j].name = plaine;
                        break;
                    case 'M':
                        carte[i][j].name = montagne;
                        break;
                    case '+':
                        carte[i][j].name = route;
                        break;
		    case 'F':
                        carte[i][j].name = foret;
                        break;
		    case '~':
                        carte[i][j].name = mer;
                        break;
                    case '=':
                        carte[i][j].name = base1;
                        break;
		    case '#':
                        carte[i][j].name = base2;
                        break;
                    default:
                        printf("Fichier map corrompu !");   // Si le caractère du fichier n'est pas connu
                        exit(EXIT_FAILURE);
                        break;
                }
		carte[i][j].defense = lands_stats[carte[i][j].name][0];
                int indice;
                for (indice=0;indice<5;indice++){
                    carte[i][j].costs[indice] = lands_stats[carte[i][j].name][indice+1];
                }
                }
                fscanf(f1, "%c", &c);
                if (c!='\n') {
                printf("Fichier map corrompu !");   // Si les lignes sont trop grandes
                exit(EXIT_FAILURE);
                }
        }
    }
    fclose(f1);
}
